import axios from 'axios';
import router from '@/router/index.js';
import appStorage from '@/stores/storage.js';
import { StorageKey } from '@/constant/index.js';

//创建axios实例
const instance = axios.create({
    timeout: 1000 * 30,
    withCredentials: false
});

//请求拦截器
instance.interceptors.request.use(
    config => {
        // 登录流程控制中，根据本地是否存在token判断用户的登录情况
        // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
        // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
        // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
        const token = appStorage.getSession(StorageKey.TOKEN);
        if (token) {
            token && (config.headers["token"] = token);
        }
        return config;
    },
    error => Promise.error(error)
);

// 响应拦截器
instance.interceptors.response.use(
    // 请求成功
    response => {
        if (response.status === 200) {
            if (response.data.code === 401) {
                errorHandle(401, response.data.msg);
                return;
            }
            return Promise.resolve(response.data);
        }
        else {
            return Promise.reject(response);
        }
    },
    // 请求失败
    error => {
        const response = error;
        if (response.status) {//能请求服务器，但是不是2xx（例如200）响应码
            if (response.status !== 500) {                
                errorHandle(response.status, response.response.data);
            }
            else {
                let _resp = { data: null, msg: "服务器错误！", status: 500 };
                return Promise.reject(_resp);
            }
        }
        else if (response.code && response.code === "ERR_NETWORK") {
            let _resp = { data: null, msg: "网络错误！", status: 500 };
            return Promise.reject(_resp);
        }
        else if (response.code && response.code == "ECONNABORTED") {
            let _resp = { data: null, msg: "请求超时！", status: 500 };
            return Promise.reject(_resp);
        }
        else {
            let _resp = { data: null, msg: "未知错误！", status: 500 };
            return Promise.reject(_resp);
        }
    }
);

const errorHandle = (status, msg) => {
    // 状态码判断
    switch (status) {
        case 400:
            ElMessage.error("400：请求服务器地址错误。");
            return;
        // 401: 未登录状态，跳转登录页
        case 401:
            break;
        // 403 token过期，清除token并跳转登录页
        case 403:
            appStorage.removeSession(StorageKey.TOKEN);
            break;
        case 404:
            ElMessage.error("404：请求服务器地址错误。");
            return;
        case 405://无权限访问接口
            ElMessage.error("405：无权限访问，请与管理员联系。");
            return;
        // 406 登录信息不一致，异地登录
        case 406:
            break;
        default:
            console.log(msg);
            break;
    }
    ElMessageBox.alert(msg, '提示', {
        confirmButtonText: 'OK',
        callback: (action) => {
            router.push('/login');//跳转到登录页            
        },
    });
};

export default instance;